/*
 * DatosMensajeFactory.cpp
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosMensajeFactory.h"

namespace aplicacion {

DatosMensajeFactory::DatosMensajeFactory()
#ifdef ENJUGADOR
	: _contexto (CONTEXTO_JUGADOR)
#elif ENPLANETA
	: _contexto (CONTEXTO_PLANETA)
#elif ENDIRECTORIO
#else
	#error contexto indefinido
#endif
{
	logger << "contexto inicial: " << getContextoAsString() << logger.endl;
}

DatosMensajeFactory::~DatosMensajeFactory() {
}

void DatosMensajeFactory::setContexto (const contexto_datosMsjFactory& contexto)
{
	logger << "contexto actualizado a: " << getContextoAsString() << logger.endl;
	_contexto = contexto;
}

std::string DatosMensajeFactory::getContextoAsString() {
	switch(_contexto) {
	case CONTEXTO_JUGADOR:
		return std::string("jugador");
	case CONTEXTO_PLANETA:
		return std::string("planeta");
	default:
		return std::string("desconocido");
		break;
	}
}

DatosMensaje* DatosMensajeFactory::create(t_tipoMensaje tipoCrear)
{
	DatosMensaje* retDatos = NULL;
	switch (tipoCrear) {
		case AVISO_CAMBIO_RUMBO_FLOTA:

			//dependiendo del contexto se devuelve un tipo adecuado
			switch (_contexto) {
				case CONTEXTO_PLANETA:
					//si se esta en el planeta el aviso es para el destino
					retDatos = this->createCambiarRumboAvisoDestino();
					break;
				case CONTEXTO_JUGADOR:
					//si se esta en el jugador el aviso es para el juego
					retDatos = this->createCambiarRumboAvisoJugador();
					break;
			}
			break;

		case CAMBIO_DUENO:
			retDatos = this->createCambiaDuenio();
			break;

		case JUGADOR_CAMBIO_RUMBO_FLOTA:
			retDatos = this->createCambiarRumboOrden();
			break;

		case JUGADOR_CREAR_FLOTA:
			retDatos = this->createCrearFlotaOrden();
			break;

		case AVISO_CREAR_FLOTA:
			//dependiendo del contexto se devuelve un tipo adecuado
			switch (_contexto) {
				case CONTEXTO_PLANETA:
					//si se esta en el planeta el aviso es para el destino
					retDatos = this->createCrearFlotaAvisoDestino();
					break;
				case CONTEXTO_JUGADOR:
					//si se esta en el jugador el aviso es para el juego
					retDatos = this->createCrearFlotaAvisoJugador();
					break;
			}
			break;

		case CANT_NAVES:
			retDatos = this->createCantidadNaves();
			break;

		case ARRIBO_NAVE:
			retDatos = this->createArriboNave();
			break;
		case INICIO_JUEGO:
			retDatos = this->createInicioJuego();
			break;
		case FIN_JUEGO:
			retDatos = this->createFinJuego();
			break;
		case ABANDONA_JUGADOR:
			retDatos = this->createAbandonaJugador();
			break;
		case UNIR_A_UNIVERSO:
			retDatos = this->createUnirAUniverso();
			break;
		case MSGTYP_CREAR_UNIVERSO:
			retDatos = this->createCrearUniverso();
			break;
		case UNIDO_A_UNIVERSO:
			retDatos = this->createUnidoAUniverso();
			break;
		case CREADO_UNIVERSO:
			retDatos = this->createCreadoUniverso();
			break;

		//TODO IMPLEMENTAR, PARA CADA TIPO CREAR LA INSTANCIA CORRESPONDIENTE
		case DESUNIR_DE_UNIVERSO:
		case MSGTYP_CREAR_JUEGO:
		case UNIR_A_JUEGO:
		case DESUNIR_DE_JUEGO:
		case DISPOSICION_INICIO_JUEGO:
		case QUERY_JUEGOS:
		case QUERY_UNIVERSOS:
		default:
			break;
	}

	return retDatos;
}

DatosArriboNave* DatosMensajeFactory::createArriboNave()
{
	return new DatosArriboNave();
}

DatosCantidadNaves* DatosMensajeFactory::createCantidadNaves()
{
	return new DatosCantidadNaves();
}

DatosCambiarRumboOrden* DatosMensajeFactory::createCambiarRumboOrden()
{
	return new DatosCambiarRumboOrden();
}

DatosCambiarRumboAvisoDestino* DatosMensajeFactory::createCambiarRumboAvisoDestino
									(Flota* flotaDatos)
{
	if (!flotaDatos)
		flotaDatos = new Flota();
	return new DatosCambiarRumboAvisoDestino(flotaDatos);
}

DatosCambiarRumboAvisoJugador* DatosMensajeFactory::createCambiarRumboAvisoJugador(Flota* flotaDatos)
{
	if (!flotaDatos)
		flotaDatos = new Flota();
	return new DatosCambiarRumboAvisoJugador(flotaDatos);
}

DatosCambiaDuenio* DatosMensajeFactory::createCambiaDuenio()
{
	return new DatosCambiaDuenio();
}

DatosCrearFlotaOrden* DatosMensajeFactory::createCrearFlotaOrden()
{
	return new DatosCrearFlotaOrden();
}

DatosCrearFlotaAvisoDestino* DatosMensajeFactory::createCrearFlotaAvisoDestino()
{
	return new DatosCrearFlotaAvisoDestino();
}

DatosCrearFlotaAvisoJugador* DatosMensajeFactory::createCrearFlotaAvisoJugador()
{
	return new DatosCrearFlotaAvisoJugador();
}

DatosInicioJuego* DatosMensajeFactory::createInicioJuego()
{
	return new DatosInicioJuego();
}

DatosFinJuego* DatosMensajeFactory::createFinJuego()
{
	return new DatosFinJuego();
}

DatosAbandonaJugador* DatosMensajeFactory::createAbandonaJugador()
{
	return new DatosAbandonaJugador();
}

DatosUnirAUniverso* DatosMensajeFactory::createUnirAUniverso()
{
	return new DatosUnirAUniverso();
}

DatosCrearUniverso* DatosMensajeFactory::createCrearUniverso()
{
	return new DatosCrearUniverso();
}

DatosUnidoAUniverso* DatosMensajeFactory::createUnidoAUniverso()
{
	return new DatosUnidoAUniverso();
}

DatosCreadoUniverso* DatosMensajeFactory::createCreadoUniverso()
{
	return new DatosCreadoUniverso();
}

} //namespace aplicacion
